package com.reactnativenavigation.views.sharedElementTransition; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import java.util.ArrayList; import java.util.List; public class SharedElementsAnimator { private final SharedElements sharedElements; public SharedElementsAnimator(SharedElements sharedElements) { this.sharedElements = sharedElements; } public void show(final Runnable onAnimationStart, final Runnable onAnimationEnd) { sharedElements.hideToElements(); sharedElements.performWhenChildViewsAreDrawn(new Runnable() { @Override public void run() { final AnimatorSet animatorSet = createShowAnimators(); sharedElements.attachChildViewsToScreen(); sharedElements.showToElements(new Runnable() { @Override public void run() { sharedElements.hideFromElements(); animatorSet.start(); } }); } private AnimatorSet createShowAnimators() { final AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(createTransitionAnimators()); animatorSet.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { onAnimationStart.run(); } @Override public void onAnimationEnd(Animator animation) { sharedElements.onShowAnimationEnd(); onAnimationEnd.run(); } @Override public void onAnimationCancel(Animator animation) { sharedElements.onShowAnimationEnd(); } }); return animatorSet; } private List<Animator> createTransitionAnimators() { List<Animator> result = new ArrayList<>(); for (String key : sharedElements.toElements.keySet()) { SharedElementTransition toElement = sharedElements.getToElement(key); SharedElementTransition fromElement = sharedElements.getFromElement(key); result.addAll(new SharedElementAnimatorCreator(fromElement, toElement).createShow()); } return result; } }); } public void hide(final Runnable onAnimationStart, final Runnable onAnimationEnd) { AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(createHideTransitionAnimators()); animatorSet.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { onAnimationStart.run(); } @Override public void onAnimationEnd(Animator animation) { sharedElements.showToElements(); onAnimationEnd.run(); } }); sharedElements.onHideAnimationStart(); animatorSet.start(); } private List<Animator> createHideTransitionAnimators() { List<Animator> result = new ArrayList<>(); for (String key : sharedElements.toElements.keySet()) { result.addAll(new SharedElementAnimatorCreator(sharedElements.getToElement(key), sharedElements.getFromElement(key)).createHide()); } return result; } }